package cool.ale.errorMessage.util;

import cool.ale.errorMessage.threadPool.AleErrorMessageThreadPool;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.Callable;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * 项目启动线程池工具类
 *
 * @author dujlc
 * @date 2022/12/4 16:54
 * @see
 * @since 1.0
 */
@Slf4j
public class AleErrorMessageThreadPoolUtil {

    /**
     * 在第一次调用这个工具类时初始化该线程池
     */
    private static ThreadPoolExecutor poolExecutor = AleErrorMessageThreadPool.getInstance();

    /**
     * 定义一个该线程池有返回方法的调用（会等待）
     * @param callable      Callable线程类型
     * @return      返回执行完成后的结果
     */
    public static String submit(Callable callable) {
        Future<String> future = poolExecutor.submit(callable);
        try {
            String result = future.get();
            return result;
        }catch (Exception e){
            log.error("线程执行出现异常，异常信息为：{}", e);
            return null;
        }
    }

    /**
     * 定义一个调用线程执行没有返回值的方法（不会等待）
     * @param runnable      Runnable线程类型
     */
    public static void execute(Runnable runnable){
        poolExecutor.execute(runnable);
    }

    /**
     * 关闭线程池方法（慎用）
     * 可以在项目启动5分钟后关闭该线程池
     */
    public static void shutdown(){
        try {
            Thread.sleep(1000 * 60 * 5);
        }catch (Exception e){
            log.error("AppStartThreadPool关闭时出现异常，异常信息为：{}", e);
        }
        poolExecutor.shutdown();
    }
}
